Specyfikacja WebAssembly
WebAssembly (skrócone jako Wasm) jest otwartym standardem określającym binarny format instrukcji oraz wirtualną maszynę, umożliwiającą uruchamianie kodu w przeglądarkach internetowych oraz w środowiskach niezależnych od przeglądarki. Specyfikacja definiuje zarówno format pliku, jak i semantykę wykonywania, zapewniając wysoką wydajność i bezpieczeństwo.
Historia
Prace nad WebAssembly rozpoczęły się w 2015 roku w inicjatywie Mozilla, Google i Microsoft. Pierwsza publiczna wersja specyfikacji, oznaczona jako MVP (Minimum Viable Product), została ogłoszona w 2017 roku. W 2019 roku organizacja W3C przyjęła specyfikację jako rekomendację, a kolejna wersja została zatwierdzona w 2020 roku.
Struktura specyfikacji
Specyfikacja WebAssembly jest podzielona na kilka kluczowych części:
- Format binarny – opisuje sposób kodowania modułów w postaci plików
.wasm. - Format tekstowy – przyjazna dla człowieka reprezentacja (WAT – WebAssembly Text).
- Model typów – definiuje typy prymitywne (
i32,i64,f32,f64) oraz typy funkcji. - Instrukcje – zbiór operacji niskopoziomowych, podzielonych na kategorie (kontrola przepływu, arytmetyka, pamięć, itp.).
- Model pamięci – liniowy bufor pamięci, dostępny poprzez instrukcje
loadistore. - Model bezpieczeństwa – sandbox, izolacja pamięci oraz walidacja podczas ładowania modułu.
Moduły
Podstawową jednostką kodu w WebAssembly jest moduł. Moduł składa się z sekcji, z których najważniejsze to:
- Sekcja niestandardowa – zawiera metadane.
- Sekcja typów – definiuje sygnatury funkcji.
- Sekcja importów – pozwala na importowanie funkcji, pamięci i globalnych zmiennych z otoczenia (np. z JavaScript).
- Sekcja funkcji – implementacje funkcji.
- Sekcja pamięci – definiuje początkowy rozmiar i maksymalny limit pamięci.
- Sekcja eksportów – udostępnia funkcje i pamięć dla kodu spoza modułu.
- Sekcja kodu – zawiera właściwe instrukcje w postaci binarnej.
Typy i instrukcje
WebAssembly obsługuje cztery podstawowe typy danych:
i32 – liczba całkowita 32‑bitowa
i64 – liczba całkowita 64‑bitowa
f32 – liczba zmiennoprzecinkowa 32‑bitowa (IEEE‑754)
f64 – liczba zmiennoprzecinkowa 64‑bitowa (IEEE‑754)
Instrukcje sÄ… podzielone na kilka grup, np.:
- Kontrola przepływu –
if,else,br,br_if,loop,call. - Arytmetyka i logika –
i32.add,i64.sub,f32.mul,i32.and. - Operacje pamięci –
i32.load,i64.store,memory.grow. - Operacje na zmiennych globalnych –
global.get,global.set.
Model pamięci i bezpieczeństwo
Pamięć WebAssembly jest reprezentowana jako jednowymiarowy bufor (tzw. linear memory), który może rosnąć w granicach określonych w sekcji pamięci. Dostęp do pamięci jest kontrolowany – każdy dostęp jest sprawdzany pod kątem przekroczenia granic, co zapobiega błędom typu buffer overflow.
Bezpieczeństwo jest zapewniane poprzez sandbox – kod Wasm działa w izolowanym środowisku, nie ma bezpośredniego dostępu do systemu operacyjnego ani zasobów przeglądarki, a jedynie to, co zostało jawnie udostępnione przez importy.
Narzędzia i ekosystem
Do kompilacji kodu źródłowego do WebAssembly wykorzystywane są m.in.:
- LLVM – potężny backend, obsługujący języki C++, Rust, C i inne.
- Emscripten – zestaw narzędzi do kompilacji C/C++ do Wasm.
- AssemblyScript – język podobny do TypeScript, kompilujący bezpośrednio do Wasm.
W przeglądarkach współczesnych (np. Chrome, Firefox, Safari, Edge) WebAssembly jest obsługiwane natywnie i umożliwia uruchamianie kodu z prędkością zbliżoną do natywnej.
Zastosowania
WebAssembly znalazło zastosowanie w wielu dziedzinach:
- Gry i aplikacje 3‑D – silniki takie jak Unity i Unreal Engine eksportują gry do Wasm.
- Obróbka multimediów – kodeki audio i wideo, edytory grafiki.
- Wirtualizacja i środowiska uruchomieniowe – Docker i WebContainers.
- Komputacja naukowa – symulacje, algorytmy numeryczne.
- Rozszerzenia przeglądarek i dodatki bezpieczeństwa.
Rozwój i przyszłość
Specyfikacja jest stale rozwijana przez grupÄ™ WebAssembly Community Group. W najnowszych wersjach wprowadzono m.in.:
- Rozszerzenia SIMD – wsparcie dla instrukcji wektorowych.
- Wielowątkowość – Threads i SharedArrayBuffer.
- Interfejsy WASI (WebAssembly System Interface) – umożliwiające dostęp do zasobów systemowych poza przeglądarką.
- Rozszerzenia GC – planowane wprowadzenie automatycznego zarządzania pamięcią.
Bibliografia i źródła
Głównym źródłem wiedzy jest oficjalna specyfikacja WebAssembly publikowana przez W3C oraz organizację WebAssembly Community Group. Szczegółowe informacje można znaleźć w dokumentacji projektów LLVM, Emscripten oraz w artykułach akademickich opisujących wydajność i bezpieczeństwo tego standardu.